/*
 * Copyright (c) 2025 CAX Conversion Project
 */
package com.comac.ins.isfd.util;

import cn.hutool.extra.pinyin.PinyinUtil;
import com.comac.ins.common.core.utils.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TableNameGenerator {

    public static String generatePinyinTableName(List<String> fields) {
        StringBuilder tableName = new StringBuilder("table_");
        // 处理每个字段
        for (int i = 0; i < fields.size(); i++) {
            String field = fields.get(i);
            if (StringUtils.isEmpty(field)) {
                continue;
            }
            // 对于最后一个字段，取全拼
            if (i == fields.size() - 1) {
                String pinyin = convertToPinyin(field);
                tableName.append(pinyin);
            } else {
                // 对于前面字段，取首字母
                String firstLetter = convertToFirstLetter(field);
                tableName.append(firstLetter);
            }
            tableName.append("_");
        }
        // 添加哈希值，确保唯一性
        String hashValue = generateHash(fields);
        tableName.append(hashValue);

        // 去掉最后一个下划线
        tableName.setLength(tableName.length() - 1);
        // 限制表名长度（MongoDB表名最大120字节）
        return tableName.length() > 64 ? tableName.substring(0, 64) : tableName.toString();
    }

    // 将中文转换为拼音
    public static String convertToPinyin(String chinese) {
        // 使用Hutool的PinyinUtil将中文转换为拼音
        return PinyinUtil.getPinyin(chinese, "");
    }

    // 获取中文字段的首字母
    public static String convertToFirstLetter(String chinese) {
        StringBuilder firstLetter = new StringBuilder();
        for (char c : chinese.toCharArray()) {
            if (Character.isWhitespace(c)) {
                continue;
            }
            String pinyin = PinyinUtil.getPinyin(String.valueOf(c), "");
            firstLetter.append(pinyin.charAt(0));  // 取拼音的首字母
        }
        return firstLetter.toString();
    }

    // 生成哈希值，确保唯一性
    public static String generateHash(List<String> fields) {
        // 合并字段为一个字符串
        String combined = String.join("_", fields);
        // 使用hashCode生成哈希值，并转换为十六进制
        int hashCode = combined.hashCode();
        return Integer.toHexString(hashCode);
    }

    public static void main(String[] args) {
        // 示例：传入字段
        List<String> fields = new ArrayList<>(Arrays.asList("用户数据表", "121", "测试表"));
        String tableName = generatePinyinTableName(fields);
        System.out.println("生成的表名: " + tableName);
        System.out.println("使用的拼音实现：" + PinyinUtil.getEngine());
    }
}
